#ifndef ECGDEVICE_H
#define ECGDEVICE_H

#include "BioSignalDevice.h"
#include "DatabaseWorker.h"
#include <QSerialPort>
#include <QTimer>
#include <QFile>
#include <QTextStream>
#include <QMutex>
#include <QVector>
#include <QQueue>
#include <deque>

class ECGDevice : public BioSignalDevice
{
    Q_OBJECT
public slots:
    void processDatabaseQueue(const QVector<QVector<double>>& batchData,
                                     const QVector<QVector<double>>& batchRawData,
                                         qint64 batchTimestamp);
public:
    explicit ECGDevice(QObject *parent = nullptr);
    ~ECGDevice() override;

    bool connect() override;
    bool disconnect() override;
    bool startAcquisition() override;
    bool stopAcquisition() override;
    QString getDeviceInfo() const override;

    // 获取通道数据（用于绘图）
    QVector<double> getChannelData(int channel) const;
    //分离线程
    void moveToThread(QThread* thread);
    void processInThread();
    QSerialPort *m_serialPort;

signals:
    // 修改信号，添加时间戳参数
    void dataReady(const QVector<double>& data, int channel, qint64 timestamp);
    void leadOffDetected(bool isLeadOff);
    void allChannelsDataReady(const QVector<double>& data, qint64 timestamp);


private slots:
    void readSerialData();
    void handleSerialError(QSerialPort::SerialPortError error);

private:
    // 常量定义
    static const int CHANNELS = 8;        // 8个通道
    static const int SAMPLE_RATE = 250;   // 采样率250Hz
    static constexpr double LSB = 0.000000268; // LSB值
    static constexpr double GAIN = 12;        // 增益

    // 滤波器相关常量和变量
    static const int FILTER_ORDER = 4;     // 滤波器阶数
    static const int PROCESSING_BLOCK_SIZE = 250; // 处理块大小（1秒数据）

    // 串口相关
    QTimer *m_readTimer;
    QByteArray m_frameHeader;
    QByteArray m_receiveBuffer;
    int m_headerIndex;
    int m_bufferIndex;

    // 数据文件
    QFile m_dataFile;
    QTextStream m_dataStream;

    // 通道数据缓冲
    QVector<double> m_channelData[CHANNELS];
    mutable QMutex m_dataMutex;

    // 滤波器相关
    QVector<double> m_rawEcgAccumulator[CHANNELS]; // 原始数据累积缓冲区
    QQueue<double> m_filteredOutputQueue[CHANNELS]; // 滤波后的数据输出队列

    // 滤波器系数
    QVector<double> m_notchB, m_notchA;  // 陷波器系数
    QVector<double> m_bandpassB, m_bandpassA; // 带通滤波器系数

    // 私有方法
    bool sendCommand(unsigned char command);
    bool resetADS1298();
    int32_t parseECGData(const QByteArray &data, int offset);
    double convertToVoltage(int32_t adcValue);
    void calculateChecksum(const QByteArray &data, int length, uint8_t *sumcheck, uint8_t *addcheck);
    void parseLeadOffStatus(uint8_t leadOffHigh, uint8_t leadOffLow);
    bool parseECGFrame(const QByteArray &frame);

    // 滤波相关方法
    void initializeFilters();
    QVector<double> applyNotchFilter(const QVector<double>& input);
    QVector<double> applyBandpassFilter(const QVector<double>& input);
    QVector<double> filterEcgData(const QVector<double>& input);

    // 高级滤波方法（基于filter.py中的filtfilt实现）
    QVector<double> filtfilt(const QVector<double>& b, const QVector<double>& a, const QVector<double>& x);
    QVector<double> lfilter(const QVector<double>& b, const QVector<double>& a, const QVector<double>& x);
    QVector<double> padSignal(const QVector<double>& x, int padlen);

    //实时滤波器状态变量
    QVector<double> m_notchZ1, m_notchZ2;  // 陷波器状态变量
    QVector<double> m_bpZ1, m_bpZ2;        // 带通滤波器状态变量

    //实时滤波方法
    double applyNotchFilterSample(double sample, int channel);
    double applyBandpassFilterSample(double sample, int channel);
    double filterEcgSample(double sample, int channel);

    // 数据库工作线程
    QThread* m_dbThread;
    DatabaseWorker* m_dbWorker;

    // 批处理相关
    QVector<QVector<double>> m_dbBatchBuffer;
    QVector<qint64> m_dbBatchTimestamps;
    int m_batchSize;
    QTimer* m_batchTimer;

    // 批处理方法
    void processBatchData();
    QMutex m_dataMutex1;  // 保护数据访问的互斥锁
    QThread* m_workerThread; // 工作线程
};

#endif // ECGDEVICE_H
